package public

import (
	"errors"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"log"
	"time"
)

type User struct {
	ID        string    `json:"id" gorm:"primaryKey;type:varchar(36)"`
	Username  string    `json:"username" gorm:"type:varchar(255);not null;unique"`
	Password  string    `json:"-" gorm:"type:varchar(255);not null"`
	CreatedAt time.Time `json:"created_at" gorm:"type:datetime;default:CURRENT_TIMESTAMP"`
}

type Question struct {
	ID        string    `json:"id" gorm:"primaryKey;type:varchar(36)"`
	Content   string    `json:"content" gorm:"type:text;not null"`
	Answer    string    `json:"-" gorm:"type:text;not null"`
	Category  string    `json:"category" gorm:"type:varchar(255);not null"`
	WrongCnt  int       `json:"wrong_cnt" gorm:"type:int;default:0"`
	CreatedAt time.Time `json:"created_at" gorm:"type:datetime;default:CURRENT_TIMESTAMP"`
}

var db *gorm.DB // 使用 GORM 替换原生的 sql.DB

// 初始化数据库连接
func InitDB() error {
	dsn := "root:123456@tcp(121.36.228.151:3306)/xxz?charset=utf8mb4&parseTime=True&loc=Local"
	var err error
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		return fmt.Errorf("无法连接数据库: %v", err)
	}
	// 自动迁移表结构
	err = db.AutoMigrate(&Question{}, &User{})
	if err != nil {
		return fmt.Errorf("自动迁移失败: %v", err)
	}
	log.Println("数据库连接成功，表结构已自动迁移")
	return nil
}

// 根据用户名查询用户
func GetUserByUsername(username string) (User, error) {
	var user User
	err := db.Where("username = ?", username).Find(&user).Error
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return User{}, fmt.Errorf("用户不存在")
		}
		return User{}, fmt.Errorf("无法获取用户: %v", err)
	}
	return user, nil
}

// 添加用户
func AddUserToDB(user User) error {
	err := db.Create(&user).Error
	if err != nil {
		return fmt.Errorf("无法添加用户: %v", err)
	}
	return nil
}

// 添加题目
func AddQuestionToDB(q Question) error {
	err := db.Create(&q).Error
	if err != nil {
		log.Printf("数据库添加题目失败: %v", err)
		return fmt.Errorf("无法添加题目: %v", err)
	}
	return nil
}

// 获取所有题目
func GetAllQuestionsFromDB() ([]Question, error) {
	var questions []Question
	err := db.Find(&questions).Error
	if err != nil {
		return nil, fmt.Errorf("无法获取题目: %v", err)
	}
	return questions, nil
}

// 根据ID获取题目
func GetQuestionByIDFromDB(id string) (Question, error) {
	var q Question
	err := db.Where("id = ?", id).First(&q).Error
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return Question{}, fmt.Errorf("题目不存在")
		}
		return Question{}, fmt.Errorf("无法获取题目: %v", err)
	}
	return q, nil
}

// 更新错题计数
func UpdateWrongCntInDB(id string) error {
	err := db.Model(&Question{}).Where("id = ?", id).Update("wrong_cnt", gorm.Expr("wrong_cnt + 1")).Error
	if err != nil {
		log.Printf("更新错题计数失败: %v", err)
		return fmt.Errorf("无法更新错题计数: %v", err)
	}
	return nil
}

// 获取高频错题
func GetTopWrongQuestionsFromDB(limit int) ([]Question, error) {
	var questions []Question
	err := db.Order("wrong_cnt DESC").Limit(limit).Find(&questions).Error
	if err != nil {
		return nil, fmt.Errorf("无法获取错题排行: %v", err)
	}
	return questions, nil
}
